Links en 'flowing text'

Deze tutorial toont hoe U links (intern en extern) kunt invoegen en toont een nieuwe manier om tekst te schrijven. Het bevat ook een HTML parser die nog in ontwikkeling is.

<?php
require('fpdf.php');

class
PDF extends FPDF
{
var
$B;
var
$I;
var
$U;
var
$HREF;

function
PDF($orientation='P',$unit='mm',$format='A4')
{
    
//Roep de constructor aan
    
$this->FPDF($orientation,$unit,$format);
    
//Initialisatie
    
$this->B=0;
    
$this->I=0;
    
$this->U=0;
    
$this->HREF='';
}

function
WriteHTML($html)
{
    
//HTML parser
    
$html=str_replace("\n",' ',$html);
    
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach(
$a as $i=>$e)
    {
        if(
$i%2==0)
        {
            
//Tekst
            
if($this->HREF)
                
$this->PutLink($this->HREF,$e);
            else
                
$this->Write(5,$e);
        }
        else
        {
            
//Tag
            
if($e{0}=='/')
                
$this->CloseTag(strtoupper(substr($e,1)));
            else
            {
                
//Filter de attributen
                
$a2=explode(' ',$e);
                
$tag=strtoupper(array_shift($a2));
                
$attr=array();
                foreach(
$a2 as $v)
                    if(
ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
                        
$attr[strtoupper($a3[1])]=$a3[2];
                
$this->OpenTag($tag,$attr);
            }
        }
    }
}

function
OpenTag($tag,$attr)
{
    
//Open tag
    
if($tag=='B' or $tag=='I' or $tag=='U')
        
$this->SetStyle($tag,true);
    if(
$tag=='A')
        
$this->HREF=$attr['HREF'];
    if(
$tag=='BR')
        
$this->Ln(5);
}

function
CloseTag($tag)
{
    
//Sluit tag
    
if($tag=='B' or $tag=='I' or $tag=='U')
        
$this->SetStyle($tag,false);
    if(
$tag=='A')
        
$this->HREF='';
}

function
SetStyle($tag,$enable)
{
    
//Wijzig stijl en selecteer lettertype
    
$this->$tag+=($enable ? 1 : -1);
    
$style='';
    foreach(array(
'B','I','U') as $s)
        if(
$this->$s>0)
            
$style.=$s;
    
$this->SetFont('',$style);
}

function
PutLink($URL,$txt)
{
    
//Plaatst een  hyperlink
    
$this->SetTextColor(0,0,255);
    
$this->SetStyle('U',true);
    
$this->Write(5,$txt,$URL);
    
$this->SetStyle('U',false);
    
$this->SetTextColor(0);
}
}

$html='U kunt nu eenvoudig tekst weergeven met verschillende stijlen: <B>bold
(=vet)</B>, <I>italic (=cursief)</I>, <U>underlined (=onderstreept)</U>, of
<B><I><U>allemaal tegelijk</U></I></B>!<BR>U kunt ook links toevoegen op tekst,
zoals <A HREF="http://www.fpdf.org">www.fpdf.org</A>, of op een afbeelding:
Klik dan op het logo.'
;

$pdf=new PDF();
//Eerste pagina
$pdf->AddPage();
$pdf->SetFont('Arial','',20);
$pdf->Write(5,'Om uit te zoeken wat er nieuw is aan deze tutorial, klik ');
$pdf->SetFont('','U');
$link=$pdf->AddLink();
$pdf->Write(5,'hier',$link);
$pdf->SetFont('');
//Tweede pagina
$pdf->AddPage();
$pdf->SetLink($link);
$pdf->Image('logo.png',10,10,30,0,'','http://www.fpdf.org');
$pdf->SetLeftMargin(45);
$pdf->SetFontSize(14);
$pdf->WriteHTML($html);
$pdf->Output();
?>

De nieuwe methode om tekst weer te geven is Write(). Het is bijna gelijk aan MultiCell(); De verschillen zijn: Het staat dus toe een heleboel tekst weer te geven, de stijl van het lettertype te wijzigen, en daarna verder te gaan precies waar we waren gebleven. Maar, pas op, het is niet mogelijk de tekst uit te vullen met deze methode.

De methode wordt gebruikt op de eerste pagina om een link te plaatsen naar de tweede. Het begin van de zin is geschreven in een standaard stijl, daarna schakelen we over naar onderstrepen en voltooien het. De link wordt aangemaakt met AddLink(), welke de link identifier teruggeeft. De identifier wordt doorgegeven als derde parameter van Write(). Zodra de tweede pagina aangemaakt is, gebruiken we SetLink() om de link naar het begin van de huidige pagina te laten verwijzen.

Daarna plaatsen we een afbeelding met een link erop. Een externe link wijst nar een URL (HTTP, mailto...). De URL wordt eenvoudig doorgegeven als laatste parameter van Image(). Merk op dat externe links niet werken wanneer de PDF wordt weergegeven in Netscape's plug-in.

Ten slotte wordt de linker marge verschoven achter de afbeelding met SetLeftMargin() en er wordt wat tekst in HTML formaat weergegeven. Er wordt hiervoor een HTML parser gebruikt, gebaseerd op de standaard expressie splitting functie preg_split() en de optie PREG_SPLIT_DELIM_CAPTURE (geïntroduceerd in PHP 4.0.5) waarmee het mogelijk is ook scheidingstekens te filteren (in dit geval de tags). Als U een oudere versie van PHP gebruikt, vervang dan de regel met deze:

$a=preg_split('/[<>]/',$html);

Het is niet zo strict, maar geeft hetzelfde resultaat met standaard HTML.
Herkende tags zijn <B>, <I>, <U>, <A> and <BR>; de andere worden genegeerd. De parser maakt ook gebruik van de Write() method. Een externe link wordt op dezelfde manier geplaatst als een interne (derde parameter van Write()).
Merk op dat het met Cell() ook mogelijk is links te plaatsen.